/****************************************************************************************************************************
 * Copyright © dimon.chen 2024-2034 All right reserved. GPL2.0 License 
 * 文件名   :   led.s
 * 作者     :   dimon.chen
 * 版本     :   V1.0
 * 描述     :   正点原子I.MX6U ALPHA/Mini 开发板Linuxa之ARM裸机开发
 *              裸机实验按键输入，练习通过GPIO input 读取gpio引脚的输入电平来判断按键是否按下，本节也介绍了gpio检测按键时通过
 * 				软件延时消抖的方法。
 * 
 * 其它     :   无
 * 日期     :   2024/05/06 16:06
 * 历史     ：  出版本V1.0 2024/05/06 dimon.chen 创建
 ****************************************************************************************************************************/

#include "bsp_delay.h"
#include "bsp_key.h"
#include "bsp_gpio.h"

/*
 * @description 	: 按键初始化。
 * @param – base 	: 无
 * @return 			: 无
 */
void key_init(void)
{
	gpio_pin_config_t config;

	/* 1. 初始化IO复用，复用为GPIO1_IO18 */
	IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);

	/*
	 * 
	 * bit[0]		0		SRE,低偏摆率
	 * bit[2:1]		00		Reserved（未使用）
	 * bit[5:3]		000		DSE(当gpio位output时，驱动能力)，本节gpio为input模式所以选择DSE=0关闭output
	 * bit[7:6]		10		SPEED,速率,选择100MHz
	 * bit[10:8]	000		Reserved（未使用）
	 * bit[11]		0		ODE, Open Drain 开漏输出模式，本节gpio为input，开漏输出关闭
	 * bit[12]		1		PKE, Pull/Keeper （上拉/保持器 开关），这里使能
	 * bit[13]		1		PUE,（Pull Enable) 选择是Keeper还是PULL，本节这里选择 1 (PULL)
	 * bit[15:14]	11		PUS, (Pull Select) 上拉电阻阻值，本节选择22K欧姆上拉电阻
	 * bit[16]		0		HYS, 磁滞，本节不使用，选择0
	 * bit[31-17]	0		Reserved（未使用)
	 *
	 * 最终选择的电气特性寄存器值:
	 * 1111 0000 1000 0000 = 0xf080
	 */


	/* 2. 设置 UART1_CTS_B IO 的电气特性 */
	IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xf080);


	/* 3. 初始化 GPIO1_IO18 设置为输入 */
	config.directioin = kGPIO_DigitalInput;
	gpio_init(GPIO1, 18, &config);	
}

int key_read(void)
{

	return gpio_pinread(GPIO1, 18);
}

/*
 * @description 	: 获取按键值。
 * @param – base 	: 无
 * @return 			: 0 没有按键按下，其它值：对应的按键值。
 */
int key_getvalue(void)
{
	int ret = 0;
	static uint8_t release = 1;

	if((release == 1) && (gpio_pinread(GPIO1, 18) == 0)){ /* KEY0 按下 */
		release = 0;			/* 标记按键按下 */

		delay(10);				/* 时延消抖 */
		if(key_read() == 0){	/* 按键按下 */
			ret =  KEY0_VALUE;
		}
	}
	else if((gpio_pinread(GPIO1, 18) == 1)){			/* KEY0 释放 */
		release = 1;			/* 标记按键释放 */
		ret = 0;
	}

	return ret;
}